Quelques rappels sur les chaînes de caractères
Les chaînes de caractères s'écrivent entre guillemets (quotes en anglais), simples ou doubles. Elles peuvent être comparées entre elles avec les opérateurs classiques de comparaison : ==, !=, <, <=, >, >=.
Attention : l'ordre des chaînes ressemble à l'ordre alphabétique, mais comporte des différences. Par exemple, les majuscules sont avant les minuscules ; les caractères accentués sont "en dehors" de l'alphabet.
La concaténation (ou assemblage) de deux chaînes s'effecture grâce à l'opérateur +.
La fonction len permet d'obtenir le nombre de caractères (longueur) d'une chaîne.
Dans une chaîne, chaque caractère a un indice. Le premier caractère se situe à l'indice 0, le second à l'indice 1, etc. Pour accéder au caractère à l'indice i, dans une chaîne ch, on utilise la notation entre crochets ch[i].
Les chaînes sont des objets immutables : on ne modifie jamais l'intérieur d'une chaîne, on en crée une autre.
Le code suivant illustre ces propos.
In [1]:
txt1 = "Ceci est un texte"
txt2 = 'ceci est un autre texte'
print("A" < txt1)
print("B" < txt2)
print("A" >"a")
print("Z" < "a" and "z" < "é")
print(txt1 + txt2)
print(len(txt1))
print(len(txt2))
print(txt1[2])
Exercices
In [2]:
# Corrigé de l'exo 1 avec un for
def nbEfor(chaine):
'''
:entree chaine: une chaine de caractères dans laquelle on va compter le nb de e
:sortie compteur: le nb de e dans la chaine
'''
compteur = 0
for i in range (len(chaine)):
if chaine[i] == 'e':
compteur +=1
return compteur
nbEfor("Bonjour comment allez vous ce matin ?")
Out[2]:
Exercice maison (facile) : Modifiez le code précédent de sorte à ce que l'on passe le caractère à rechercher en paramètre...
In [3]:
# Corrigé de l'exo 1 avec un while
def nbEwhile(chaine):
'''
:entree chaine: une chaine de caractères dans laquelle on va compter le nb de e
:sortie compteur: le nb de e dans la chaine
'''
compteur = 0
i = 0
while (i < len(chaine)):
if chaine[i] == 'e':
compteur +=1
i +=1
return compteur
nbEwhile("Je veux un café !")
Out[3]:
In [4]:
# Exercice : qu'est-ce qui ne fonctionne pas dans cet algorithme (supposé répondre à l'exo 1) ?
def nbEBis(chaine):
compteur = 0
for lettre in chaine:
if lettre == 'e':
compteur +=1
return compteur
nbEBis("Moi ça roule !")
Out[4]:
Exercice maison : identifiez le problème du code précédent et corrigez-le.
Remarque sur le code ci-dessous : la recherche d'un caractère dans une chaîne est rendue très facile en Python... mais nous faisons de l'algo ici... nous cherchons donc des solutions génériques et transposables à d'autres langages de programmation. C'est pourquoi nous allons éviter de prendre ce genre de raccourci !
In [5]:
if "c" in "abc":
print("Le caractère est dans la chaîne")
if "d" in "abc":
print("Le caractère est dans la chaîne")
else:
print("Le caractère n'est pas dans la chaîne...")
In [6]:
# Corrigé de l'exo 2
def compteurMinuscules(chaine):
'''
:entree chaine: une chaîne de caractères
:sortie nombre: le nombre de minuscules dans la chaîne
'''
nombre = 0
for i in range(len(chaine)):
if chaine[i] <= "z" and chaine[i] >= "a":
nombre +=1
return nombre
compteurMinuscules("J'écris TouT PeTIT i")
Out[6]:
In [7]:
# Corrigé de l'exo 3
def premiereOccurence(chaine, car):
"""
:entree chaine: une chaine de caractère
:entree car: le caractère recherché
:sortie occu: la position de la premiere occurence du caractere
:post-cond: occu = -1 si le caractere n'est pas dans la chaîne
"""
i=0
occu = -1
while(occu == -1 and i < len(chaine)):
if(chaine[i] == car):
occu = i
i +=1
return occu
print(premiereOccurence("Bonjour", "j"))
print(premiereOccurence("Bonjour", "e"))
In [8]:
# Corrigé de l'exo 4
def derniereOccurence(chaine, car):
'''
:entree chaine: une chaîne de caractères
:entre car: le caractère recherché
:sortie occu: l'indice de la dernière apparition du caractère dans la chaîne
:post-cond: occu = -1 si le caractère n'est pas présent...
'''
retour =-1
for pos in range (len(chaine)):
if chaine[pos] == car:
retour = pos
return retour
print(derniereOccurence("Hello world", "l"))
print(derniereOccurence("Hello world", "d"))
print(derniereOccurence("Hello world", "f"))
Exercice maison : Réécrivez cette méthode de recherche de la dernière occurrence en parcourant la liste à partir de la fin.
In [9]:
#Corrigé de l'exercice 5
def miroir(chaine):
'''
:entre la chaine de caractère
:sortie la chaine de caractere avec les caracteres inversés
'''
stri=""
for i in range(0,len(chaine)):
stri+=chaine[len(chaine)-i-1]
return stri
print(miroir("coucou vous"))
Exercice maison : Pour chaque algorithme vu dans ce TD, donner la complexité moyenne et la complexité dans le pire des cas.
In [ ]:
#Corrigé de l'exercice 6
ch=str(input("Entrez votre caractere"))
def mots (ch):
'''
:entree:une chaine de caracteres
:sortie: nbr de mots
'''
mot=int()
for i in range (0,len(ch)-1):
if ch[i]!=' ' and ch[i+1]==' ':
mot+=1
return (mot+1)
print (mots(ch))
Exercice maison : Cet algo est presque parfait... sauf quand la chaîne de caractères se termine par des espaces.
Pourquoi ?
Vous en profiterez pour écrire la spécification de ce problème.
In [ ]: